iOS多线程 - 3种方式创建线程

首先来看这个方法:

1
public class func detachNewThreadSelector(selector: Selector, toTarget target: AnyObject, withObject argument: AnyObject?)

下面这个是常见的 init 创建线程:

1
public convenience init(target: AnyObject, selector: Selector, object argument: AnyObject?)

这两种创建方式有哪些不同呢?我们对比来看下:

init 是一个构造器,detachNewThreadSelector 是一个类型方法。detachNewThreadSelector 返回值是 void,也就是说没有返回值。detachNewThreadSelector 在调用后立即启动,不需要 start 方法。

下面我们来使用这个方法,在 TouchesBegan 方法中写入:

1
NSThread.detachNewThreadSelector(#selector(ViewController.run), toTarget: self, withObject: "detachNewThreadSelector")

创建 run 方法:

1
2
3
func run(str: NSString) {
print(str)
}

现在我们就可以调用这个线程了。

detachNewThread 这个类型方法没有返回值,这意味着我们不能像使用 init 构造器创建那样,使用start exit name stackSize 那样控制线程启动、关闭、命名、获取栈大小,也无法使用 currentThread mainThread isMainThread threadPriority 进行获取当前线程、获取主线程、指定优先级等操作。

最后一种方法是 selectorInBackground ,从名字可以看出来,这是在在后台执行一个相应函数,与 deathNewThreadinit 不同,selectorInbackgroundObject 的实例方法,没有返回值,因此它同样不能对线程进行控制。这个方法的表达式如下:

1
performSelectorInBackground(#selector(ViewController.run(_:)), withObject: "SelectorInBackground")

通过上面的对比,我们可以得出结论,同 init 这种方式对比,detachNewThreadperformSelectorBackgroud 无法对创建的线程进行命名、比较、设定优先级等操作。